// HBuilder环境下的工具函数

declare global {
  interface Window {
    uni?: any
    plus?: any
  }
}

/**
 * 检测是否在HBuilder环境中
 */
export function isHBuilderApp(): boolean {
  return typeof window !== 'undefined' && (window.uni !== undefined || window.plus !== undefined)
}

/**
 * 在HBuilder环境中保存图片到相册
 * @param dataURL 图片的base64数据
 * @param fileName 保存的文件名
 * @returns Promise<void>
 */
export function saveImageToAlbumInHBuilder(dataURL: string, fileName: string): Promise<void> {
  return new Promise((resolve, reject) => {
    if (!isHBuilderApp()) {
      reject(new Error('不在HBuilder环境中'))
      return
    }

    // 显示加载提示
    if (window.uni) {
      window.uni.showLoading({
        title: '正在保存图片...',
        mask: true
      })
    }

    // 优先使用plus API，这是HBuilder最稳定的原生API
    if (window.plus) {
      saveWithPlusAPI(dataURL, fileName, resolve, reject)
    } 
    // 如果plus API不可用，尝试使用uni API
    else if (window.uni) {
      saveWithUniAPI(dataURL, fileName, resolve, reject)
    }
    else {
      const error = new Error('HBuilder环境检测到但API不可用')
      reject(error)
      showError(error.message)
    }
  })
}

/**
 * 使用plus API保存图片（HBuilder原生API）
 */
function saveWithPlusAPI(dataURL: string, fileName: string, resolve: () => void, reject: (error: Error) => void): void {
  try {
    // 使用HBuilder推荐的标准路径
    const filePath = `_doc/${fileName}`
    const bitmap = new window.plus.nativeObj.Bitmap('book-cover')

    // HBuilder环境中使用setTimeout确保异步操作稳定性
    setTimeout(() => {
      bitmap.loadBase64Data(dataURL, function() {
        bitmap.save(filePath, {
          overwrite: true,
          quality: 100
        }, function() {
          bitmap.clear()
          
          // 保存到相册 - 使用HBuilder官方推荐的API
          window.plus.gallery.save(filePath, function() {
            hideLoading()
            console.log('封面保存成功，显示提示')
            showSuccess('封面已成功保存到相册！\n您可以在相册中查看并使用它。')
            resolve()
          }, function(err: any) {
            bitmap.clear()
            hideLoading()
            console.error('保存到相册失败:', err)
            showError('保存到相册失败')
            
            // 备用方案：直接打开图片让用户手动保存
            try {
              const absFilePath = window.plus.io.convertLocalFileSystemURL(filePath)
              window.plus.runtime.openFile(absFilePath)
            } catch (e) {
              console.error('打开文件失败:', e)
            }
            
            reject(new Error('保存到相册失败'))
          })
        }, function(err: any) {
          bitmap.clear()
          hideLoading()
          console.error('保存图片文件失败:', err)
          showError('保存图片失败')
          
          // 备用方案：直接保存base64到相册
          try {
            window.plus.gallery.save(dataURL, function() {
              console.log('直接保存base64成功，显示提示')
              showSuccess('🎉 封面已成功保存到相册！\n您可以在相册中查看并使用它。')
              resolve()
            }, function(e: any) {
        console.error('直接保存base64失败:', e)
        reject(new Error('保存图片失败'))
      })
          } catch (e) {
            console.error('执行备用方案出错:', e)
            reject(new Error('保存图片失败'))
          }
        })
      }, function(err: any) {
        bitmap.clear()
        hideLoading()
        console.error('加载图片数据失败:', err)
        showError('加载图片失败')
        
        // 尝试直接保存base64到相册
        if (window.plus) {
          try {
            window.plus.gallery.save(dataURL, function() {
              console.log('直接保存base64成功，显示提示')
              showSuccess('🎉 封面已成功保存到相册！\n您可以在相册中查看并使用它。')
              resolve()
            }, function(e: any) {
            console.error('直接保存base64失败:', e)
            reject(new Error('保存图片失败'))
          })
          } catch (e) {
            console.error('执行备用方案出错:', e)
            reject(new Error('保存图片失败'))
          }
        } else {
          reject(new Error('加载图片失败'))
        }
      })
    }, 100)
  } catch (e: any) {
    hideLoading()
    console.error('Plus API保存失败:', e)
    showError('保存图片失败')
    reject(e)
  }
}

/**
 * 使用uni API保存图片
 */
function saveWithUniAPI(dataURL: string, fileName: string, resolve: () => void, reject: (error: Error) => void): void {
  try {
    // 将base64转换为临时文件
    const base64Data = dataURL.replace(/^data:image\/\w+;base64,/, '')
    const filePath = `_doc/${fileName}`
    
    // 使用uni的文件系统API
    const fs = window.uni?.getFileSystemManager?.()
    if (fs) {
      // 确保_doc目录存在
      try {
        fs.accessSync('_doc')
      } catch (e) {
        try {
          fs.mkdirSync('_doc')
        } catch (mkdirErr) {
          console.error('创建目录失败:', mkdirErr)
        }
      }
      
      // 将base64数据转换为ArrayBuffer
      const bytes = atob(base64Data)
      const byteLength = bytes.length
      const byteArray = new Uint8Array(byteLength)
      for (let i = 0; i < byteLength; i++) {
        byteArray[i] = bytes.charCodeAt(i)
      }
      
      // 写入文件
      fs.writeFile({
        filePath: filePath,
        data: byteArray.buffer,
        encoding: 'binary',
        success: function() {
          // 保存到相册
      window.uni.saveImageToPhotosAlbum({
        filePath: filePath,
        success: function() {
          hideLoading()
          console.log('Uni API封面保存成功，显示提示')
          showSuccess('🎉 封面已成功保存到相册！\n您可以在相册中查看并使用它。')
          resolve()
            },
            fail: function(err: any) {
              hideLoading()
              console.error('保存到相册失败:', err)
              showError('保存失败，请授权相册权限')
              
              // 引导用户授权
              if (err.errMsg && (err.errMsg.indexOf('auth deny') >= 0 || err.errMsg.indexOf('authorize') >= 0)) {
                window.uni.showModal({
                  title: '提示',
                  content: '需要您授权保存图片到相册',
                  confirmText: '去授权',
                  cancelText: '取消',
                  success: function(res: any) {
                    if (res.confirm) {
                      window.uni.openSetting()
                    }
                  }
                })
              }
              
              // 如果plus API可用，尝试直接打开文件
              if (window.plus) {
                try {
                  const absFilePath = window.plus.io.convertLocalFileSystemURL(filePath)
                  window.plus.runtime.openFile(absFilePath)
                } catch (e) {
                  console.error('打开文件失败:', e)
                }
              }
              
              reject(new Error('保存到相册失败'))
            }
          })
        },
        fail: function(err: any) {
          hideLoading()
          console.error('写入文件失败:', err)
          showError('保存图片失败')
          
          // 如果plus API可用，尝试直接保存base64
          if (window.plus) {
            try {
              window.plus.gallery.save(dataURL, function() {
                console.log('直接保存base64成功，显示提示')
                showSuccess('🎉 封面已成功保存到相册！\n您可以在相册中查看并使用它。')
                resolve()
              }, function(e: any) {
                console.error('最后的备用方案也失败:', e)
                reject(new Error('保存图片失败'))
              })
            } catch (e) {
              console.error('执行备用方案出错:', e)
              reject(new Error('保存图片失败'))
            }
          } else {
            reject(new Error('写入文件失败'))
          }
        }
      })
    } else {
      hideLoading()
      console.error('没有可用的文件系统API')
      showError('保存图片失败')
      reject(new Error('没有可用的文件系统API'))
    }
  } catch (e: any) {
    hideLoading()
    console.error('Uni API保存图片失败:', e)
    showError('保存图片失败')
    reject(e)
  }
}

/**
 * 隐藏加载提示
 */
function hideLoading(): void {
  if (window.uni) {
    try {
      window.uni.hideLoading()
    } catch (e) {
      // 忽略错误
    }
  }
}

// 显示成功提示（用户可见）
function showSuccess(title: string): void {
  console.log('尝试显示用户可见的成功提示:', title)
  
  // 确保hideLoading被调用，防止加载提示一直显示
  try {
    if (window.uni && typeof window.uni.hideLoading === 'function') {
      window.uni.hideLoading()
    }
  } catch (e) {
    console.error('隐藏加载提示失败:', e)
  }
  
  // 方案1: 使用uni.showToast显示提示（优先）
  if (window.uni && typeof window.uni.showToast === 'function') {
    try {
      window.uni.showToast({
        title: title,
        icon: 'success',
        duration: 3000, // 延长显示时间以便用户看清楚
        mask: true // 添加遮罩防止用户快速点击
      })
      console.log('已使用uni.showToast显示提示')
    } catch (e) {
      console.error('使用uni.showToast失败:', e)
      // 方案2: 使用plus.nativeUI.toast（备用）
      if (window.plus && window.plus.nativeUI && typeof window.plus.nativeUI.toast === 'function') {
        try {
          window.plus.nativeUI.toast(title, {
            type: 'success',
            duration: 'long'
          })
          console.log('已使用plus.nativeUI.toast显示提示')
        } catch (plusErr) {
          console.error('使用plus.nativeUI.toast也失败:', plusErr)
        }
      }
    }
  } 
  // 方案3: 如果uni API不可用，尝试使用plus API
  else if (window.plus && window.plus.nativeUI && typeof window.plus.nativeUI.toast === 'function') {
    try {
      window.plus.nativeUI.toast(title, {
        type: 'success',
        duration: 'long'
      })
      console.log('已使用plus.nativeUI.toast显示提示')
    } catch (e) {
      console.error('显示提示失败:', e)
    }
  } else {
    console.warn('没有可用的UI提示API')
  }
}

/**
 * 显示错误提示
 */
function showError(title: string): void {
  if (window.uni) {
    window.uni.showToast({
      title: title,
      icon: 'none',
      duration: 2000
    })
  }
}